package cz.pecinovsky.česky.oopnz._125_;
//Příliš žluťoučký kůň úpěl ďábelské ódy

import cz.pecinovsky.česky.oopnz.správce.Elipsa;
//import cz.pecinovsky.česky.oopnz.správce.IPosuvný;
import cz.pecinovsky.česky.oopnz.správce.Kreslítko;


import static cz.pecinovsky.česky.oopnz._125_.IModulový_129_133.IModulový;


////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu +++++
//%I+ =133c
//
//import správce.*;
//%I-
//%I+ >=133z
//
//import cz.pecinovsky.česky.oopnz.správceplátna.Elipsa;
//import cz.pecinovsky.česky.oopnz.správceplátna.Kreslítko;
//%I-
//%A+ >=133z

import cz.pecinovsky.česky.oopnz.utility.Barva;
import cz.pecinovsky.česky.oopnz.utility.IO;
import cz.pecinovsky.česky.oopnz.utility.Pozice;
//%A-
//%X+ xxxxx Začátek přeskakovaného textu xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí: _125_Světlo_119
 *
 * Projekt  020z_11_Správce
 *  + Doplněny dokumentační komentáře
 *</pre>
 */
public class Světlo_125_133
{    private Světlo_125_133() {}    static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- Konec přeskakovaného textu -----


/*******************************************************************************
 * Instance třídy {@code Světlo} představují simulovaná světla,
 * která se umějí rozsvítit a zhasnout.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
//%I+ <129
//public class Světlo implements IPosuvný
//%I-
//%X+ <129
public class Světlo implements IModulový
//%X-
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//%X+ <128

    private static final int IMPLICITNÍ_X = 0;

    private static final int IMPLICITNÍ_Y = 0;

    private static final Barva IMPLICITNÍ_ROZSVÍCENÁ_BARVA = Barva.ŽLUTÁ;

    private static final Barva IMPLICITNÍ_ZHASNUTÁ_BARVA = Barva.ČERNÁ;

    private static final int IMPLICITNÍ_PRŮMĚR = 50;



//%X-
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//%X+ <128

     /** Počet doposud vytvořených instancí. */
     private static int počet = 0;



//%X-
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//%I+ <128
//
//    /** Barva rozsvíceného světla. */
//    private Barva  barva;
//
//    /** Barva zhsanutého světla. */
//    private Barva zhasnutá;
//
//    /** Obrazec představující světlo na plátně. */
//    private Elipsa žárovka;
//%I-
//%X+ <128

    /** Pořadové (identifikační) číslo dané instance. */
    private final int ID;

    /** Barva rozsvíceného světla. */
    private final Barva  barva;

    /** Barva zhsanutého světla. */
    private final Barva zhasnutá;

    /** Obrazec představující světlo na plátně. */
    private final Elipsa žárovka;
//%X-



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří světlo implicitních rozměrů a barvy
     * umístěné v imlicitní pozici (levý horní roh plátna).
     */
    public Světlo()
    {
//%I+ <128
//        this(0, 0);
//%I-
//%X+ <128
        this(IMPLICITNÍ_X, IMPLICITNÍ_Y);
//%X-
    }


    /***************************************************************************
     * Vytvoří světlo implicitních rozměrů a barvy
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     */
    public Světlo(int x, int y)
    {
//%I+ <128
//        this(x, y, Barva.ŽLUTÁ);
//%I-
//%X+ <128
        this(x, y, IMPLICITNÍ_ROZSVÍCENÁ_BARVA);
//%X-
    }


    /***************************************************************************
     * Vytvoří světlo implicitních rozměrů zadané barvy rozsvíceného světla
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     * @param barva  Barva rozsvíceného světla
     */
    public Světlo(int x, int y, Barva barva)
    {
//%I+ <128
//        this(x, y, 50, barva);
//%I-
//%X+ <128
        this(x, y, IMPLICITNÍ_PRŮMĚR, barva);
//%X-
    }


    /***************************************************************************
     * Vytvoří světlo zadaných rozměrů a implicitních barev
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     * @param průměr Průměr vytváreného světla
     */
    public Světlo(int x, int y, int průměr)
    {
//%I+ <128
//        this(x, y, průměr, Barva.ŽLUTÁ);
//%I-
//%X+ <128
        this(x, y, průměr, IMPLICITNÍ_ROZSVÍCENÁ_BARVA);
//%X-
    }


    /***************************************************************************
     * Vytvoří světlo zadaných rozměrů a zadané barvy rozsvíceného světla
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     * @param průměr Průměr vytváreného světla
     * @param barva  Barva rozsvíceného světla
     */
    public Světlo(int x, int y, int průměr, Barva barva)
    {
//%I+ <128
//        this(x, y, průměr, barva, Barva.ČERNÁ);
//%I-
//%X+ <128
        this(x, y, průměr, barva, IMPLICITNÍ_ZHASNUTÁ_BARVA);
//%X-
    }


    /***************************************************************************
     * Vytvoří světlo zadaných rozměrů a
     * zadané barvy rozsvíceného i zhasnutého světla
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     * @param průměr   Průměr vytváreného světla
     * @param barva    Barva rozsvíceného světla
     * @param zhasnutá Barva zhasnutého světla
     */
    public Světlo(int x, int y, int průměr, Barva barva, Barva zhasnutá)
    {
//%X+ <128
        počet   = počet + 1;
        this.ID = počet;
//%X-
        this.barva   = barva;
        this.zhasnutá= zhasnutá;
        this.žárovka = new Elipsa(x, y, průměr, průměr, barva);
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí barvu rozsvíceného světla.
     *
     * @return  Barva rozsvíceného světla
     */
    public Barva getBarva()
    {
        return barva;
    }


    // Sada přístupových metod vlastnosti: Pozice ******************************

    /***************************************************************************
     * Vrátí x-ovou (vodorovnou) souřadnici pozice instance.
     *
     * @return  x-ová souřadnice.
     */
    public int getX()
    {
        return žárovka.getX();
    }


    /***************************************************************************
     * Vrátí y-ovou (svislou) souřadnici pozice instance.
     *
     * @return  y-ová souřadnice.
     */
    public int getY()
    {
        return žárovka.getY();
    }


    /***************************************************************************
     * Vrátí přepravku se svojí aktuální pozicí.
     *
     * @return Aktuální pozice světla
     */
    @Override
    public Pozice getPozice()
    {
        return new Pozice(getX(), getY());
    }


    /***************************************************************************
     * Nastaví novou pozici světla.
     *
     * @param p Nastavovaná pozice
     */
    @Override
    public void setPozice(Pozice p)
    {
        this.setPozice(p.x, p.y);
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
    @Override
    public void setPozice(int x, int y)
    {
        žárovka.setPozice(x, y);
    }


    // Sada přístupových metod vlastnosti: Rozměr / Modul **********************

    /***************************************************************************
     * Vrátí průměr daného světla.
     *
     * @return Průměr světla
     */
    public int getPrůměr()
    {
        return žárovka.getVýška();
    }


    /***************************************************************************
     * Vrátí základní délku, od níž se odvozují všechny rozměry objektu -
     * pro světla je to jejich průměr.
     *
     * @return Průměr světla
     */
//%X+ <129
    @Override
//%X-
    public int getModul()
    {
        return getPrůměr();
    }


    /***************************************************************************
     * Nastaví nový modul = průměr (kruhového) světla.
     *
     * @param modul  Nastavovaný průměr; průměr > 0
     */
//%X+ <129
    @Override
//%X-
    public void setModul(int modul)
    {
        žárovka.setRozměr(modul);
    }


    /***************************************************************************
     * Vrátí informaci o tom, je-li světlo právě zhasnuté.
     *
     * @return Je-li zhasnuté, vrátí {@code true}, jinak vrátí {@code false}
     */
    public boolean isZhasnuté()
    {
        return žárovka.getBarva().equals(zhasnutá);
    }



//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Světlo na půl vteřiny rozsvítí a pak je zase zhasne..
     */
    public void blikni()
    {
        rozsviť();
        IO.čekej(500);
        zhasni();
    }


    /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param kreslítko Kreslítko, které nakreslí instanci
     */
    @Override
    public void nakresli(Kreslítko kreslítko)
    {
        žárovka.nakresli(kreslítko);
    }


    /***************************************************************************
     * Rozsvítí dané světlo, tj. vybarví je barvou rozsvíceného světla.
     */
    public void rozsviť()
    {
        žárovka.setBarva(barva);
    }


    /***************************************************************************
     * Zhasne dané světlo, tj. vybarví je barvou pro zhasnuté světlo.
     */
    public void zhasni()
    {
        žárovka.setBarva(zhasnutá);
    }

//%X+ <126

    /***************************************************************************
     * Vrací textovou reprezentaci (podpis) dané instance
     * používanou především k ladicím účelům.
     *
     * @return Požadovaná textová reprezentace
     */
    @Override
    public String toString()
    {
//%X-
//%I+ >126 <128
//        return "Světlo(x="   + getX()       + ", y="        + getY() +
//               ", modul="    + getModul()   +
//               ", barva="    + barva        + ", zhasnutá=" + zhasnutá +
//               ", zhasnuté=" + isZhasnuté() + ")";
//%I-
//%X+ <128
        return "Světlo_"     + ID         + "("           + getPozice()  +
               ", modul="    + getModul() + ", barva="    + barva        +
               ", zhasnutá=" + zhasnutá   + ", zhasnuté=" + isZhasnuté() + ")";
//%X-
//%X+ <126
    }


//%X-


//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Světlo inst = new Světlo();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}


//%%-  ----- Začátek ignorovaného závěrečného textu -----
////////////////////////////////////////////////////////////////////////////////
//%== //Takto se označí řádek, jenž bude odkomentován (vhodné např. pro importy)
//Je-li na 6 pozici mezera, odmaže se také

//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        System.exit(0);
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
